﻿#include "sqlite.h"
Sqlite *Sqlite::instance = 0;
Sqlite *Sqlite::getInstance()
{
    if(instance == NULL)
    {
        instance = new Sqlite;
    }
    return instance;
}

void Sqlite::realeaseInstance()
{
    if(instance != 0)
    {
        delete instance;
        instance = 0;
    }
}

QString Sqlite::insertUser()
{
    QString str = QString("insert into user values('%1','%2')").arg(username, password);
    QSqlQuery query;
    qDebug()<<username;
    qDebug()<<password;
  //query.exec("SELECT LAST_INSERT_ROWID()");
   if(query.exec(str))
   {
       qDebug()<<"插入表成功";
       return "1";
   }
   else
   {
       qDebug()<<"插入表失败";
       return "2";
   }
}

QString Sqlite::isPasswordRight()
{
    QSqlQuery query;
    query.prepare("select * from user where name = ? and pass = ?");
    query.bindValue(0, username);
    query.bindValue(1, password);
    query.exec();
    if(query.next())
    {
        return  "3";
    }
    else
    {
        return  "4";
    }
}

Sqlite::Sqlite(QObject *parent) : QObject(parent)
{
    db = QSqlDatabase::addDatabase("QSQLITE");  //告诉计算机我用哪个数据库。
    db.setHostName("127.0.0.1");                //给数据库设置一个主机名
    db.setDatabaseName("test.db");            //数据库文件名
    db.setUserName("root");                     //用户名
    db.setPassword("123456");                   //密码。

    if(db.open())                               //打开数据库
    {
        qDebug()<<"数据库打开成功";                //如果数据库打开成功的话输出打开成功
    }
    else
    {
        qDebug()<<"数据库打开失败";               //反之输出打开失败。
    }
    //db.commit();
    //db.transaction();
    QSqlQuery query;                            //默认创建一个表。表里面是密码和用户名， 然后配置一下键值对。
    QString str = "create table user(name varchar(20), pass varchar(10),primary key (name));";
    if(query.exec(str))                        //去执行sql语句。
    {
        qDebug()<<"创建表成功";                 //告诉我们创建表是否成功。
    }
    else
    {
        qDebug()<<"创建表失败";
    }
    str = "create table addWord(name varchar(20),word varchar(20),explanation varchar(50),unique(name,word))";
    query.exec(str);


}
QString Sqlite::findWords(QString word)  //数据库这边 是不是需要有个单词  作为函数的参数传过来。
{
    //数据现在知道了 我要查什么单词之后， 数据库就开始执行sql语句，   找单词解释。
    QString str = QString("select explanation from word where word='%1';").arg(word);
    QSqlQuery query;
    query.exec(str);
    if(query.next())  // 判断是否查找到
    {
        QString expl = query.value("explanation").toString();  //把查询到的解释转换成字符串 赋给 expl
        insertHistory(word, expl);  // 插入历史     只有我查到历史记录表里面 ，他是不是才能查询到历史记录。
        return expl;     //如果说找到了单词 是不是要返回一个单词解释给查询单词界面。
    }
    else  // 没有查找到
    {
        return QString("not find");   //如果说没找到返回一个 not find 字符串。
    }
}
bool Sqlite::insertHistory(QString word, QString expl)
{
    QDateTime time = QDateTime::currentDateTime();   //显示当前的时间。
    QString ts = time.toString("yyyy-MM-dd hh:mm:ss");
    QString str = QString("insert into history values('%1','%2','%3','%4');").arg(
                username, word, expl, ts);
    qDebug()<<str;
    QSqlQuery query;
    if( query.exec(str))   //执行sql语句 并判断 是否执行成功。
        return true;        //如果执行成功 返回true.
    else
        return false;       //如果执行失败 返回false.
}
bool Sqlite::selectHistory()
{
 QString str = QString("select * from history where name='%1';").arg(username);
 //在数据库里面执行语句， 什么语句，在history表里面查找符合我要求的信息。
 QSqlQuery query;
 if(query.exec(str))
 {
     QString history;
     while(query.next())   //为什么用 while遍历， 因为历史里面不只一条查询记录。
     {
      QString s  = QString("%1|%2|%3|%4").arg(
                    query.value(0).toString(),
                    query.value(1).toString(),
                    query.value(2).toString(),
                    query.value(3).toString());
           // 发出信号
        history += s+ "          ";
     }
      emit sendHistory(history);
     return true;
 }
 else
     return false;
}

QString Sqlite::addWords(QString word)
{
    QString str = QString("select explanation from word where word='%1';").arg(word);
    QSqlQuery query;
    query.exec(str);
    if(query.next())  // 判断是否查找到
    {
        QString expl = query.value("explanation").toString();
        str = QString("insert or replace into addWord values('%1','%2','%3');").arg(
                    username, word, expl);
        if(query.exec(str))
        {
            insert_reciteWord();
            return "add success";
        }
        else
        {
            return "add false";
        }
    }
    else
    {
        return "no find";
    }
}
bool Sqlite::insert_reciteWord()
{
   QString str = QString("select * from addWord where name='%1';").arg(username);
     //在数据库里面执行语句， 什么语句，在history表里面查找符合我要求的信息。
     QSqlQuery query;
     if( query.exec(str))
     {   int i = 0;
         while(query.next())   //为什么用 while遍历， 因为历史里面不只一条查询记录。
         {
            QString s = QString("%1").arg(
                        query.value(2).toString());
             list.insert(i++,s);
             //qDebug()<<list.at(i);
         }
         return true;
     }
     else
         return false;
}

QString Sqlite::deal_CheckWord(QString word, QString username,QString exp)
{
    QSqlQuery query;
    query.prepare("select * from addWord where name = ? and  word= ? and explanation = ?");
    query.bindValue(0, username);
    query.bindValue(1, word);
    query.bindValue(2,exp);
    query.exec();
    qDebug()<<"checkWord"<<word;
    qDebug()<<"checkWord"<<username;
    if(query.next())
    {
        return  "right";
    }
    else
    {
        return  "error";
    }
}


bool Sqlite::reciteWord()
{
    insert_reciteWord();
    emit sendreciteWord(list);
}
Sqlite::~Sqlite()
{

}

